package main

import (
	"fmt"
	"sync"
)

type Counter struct {
	CounterType int
	Name        string

	mu    sync.Mutex
	count uint64
}

//加1方法，内部使用互斥锁保护
func (c *Counter) Incr() {
	c.mu.Lock()
	c.count++
	c.mu.Unlock()
}

//得到计数器的值，也需要锁保护
func (c *Counter) Count() uint64 {
	c.mu.Lock()
	defer c.mu.Unlock()
	return c.count
}

func main() {
	var counter Counter
	//互斥锁保护计数器
	//var mu sync.Mutex
	//计数器的值
	//var count = 0

	//等待10个goroutine完成
	var wg sync.WaitGroup
	wg.Add(10)

	for i := 0; i < 10; i++ {
		go func() {
			defer wg.Done()
			for j := 0; j < 100000; j++ {
				counter.Incr()
			}
		}()
	}
	//等待10个goroutine完成
	wg.Wait()
	fmt.Println(counter.Count())
}

// 冲突检测命令: go run -race counter.go
//查看编译后的代码,查看检测data race 的而插入的指令 （runtime.racefuncenter、runtime.raceread、runtime.racewrite、runtime.racefuncexit 等）
//go tool compile -race -S counter.go
